#ifndef OMG_DDS_CORE_FWD_HPP_
#define OMG_DDS_CORE_FWD_HPP_

/* Copyright (c) 2009-2010, Real-Time Innovations, Inc.
 * Copyright (c) 2010, Object Management Group, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the names of the above copyright holders nor the names of their
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL A COPYRIGHT HOLDER OR CONTRIBUTOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

class OMG_DDS_CONDITION_DELEGATE;
class OMG_DDS_DURATION_DELEGATE;
class OMG_DDS_ENTITY_DELEGATE;
class OMG_DDS_GUARD_CONDITION_DELEGATE;
class OMG_DDS_INSTANCE_HANDLE_DELEGATE;
class OMG_DDS_QOS_POLICY_COUNT_DELEGATE;
class OMG_DDS_STATUS_CONDITION_DELEGATE;
class OMG_DDS_TIME_DELEGATE;
class OMG_DDS_WAIT_SET_DELEGATE;


namespace dds {
    namespace core {
        // --- Condition: --- //
        typedef tdds::core::Condition<OMG_DDS_CONDITION_DELEGATE> Condition;

        // --- Duration: --- //
        class OMG_DDS_API Duration;

        // --- Entity: --- //
        typedef tdds::core::Entity<OMG_DDS_ENTITY_DELEGATE> Entity;

        // --- Exceptions: --- //
        class OMG_DDS_API Exception;
        class OMG_DDS_API Error;
        class OMG_DDS_API AlreadyClosedError;
        class OMG_DDS_API IllegalOperationError;
        class OMG_DDS_API ImmutablePolicyError;
        class OMG_DDS_API InconsistentPolicyError;
        class OMG_DDS_API InvalidArgumentError;
        class OMG_DDS_API InvalidDataError;
        class OMG_DDS_API NotEnabledError;
        class OMG_DDS_API OutOfResourcesError;
        class OMG_DDS_API PreconditionNotMetError;
        class OMG_DDS_API TimeoutError;
        class OMG_DDS_API UnsupportedError;

        // --- GuardCondition: --- //
        typedef tdds::core::GuardCondition<OMG_DDS_GUARD_CONDITION_DELEGATE>
        GuardCondition;

        // --- InstanceHandle: --- //
        typedef tdds::core::InstanceHandle<OMG_DDS_INSTANCE_HANDLE_DELEGATE>
        InstanceHandle;

        typedef std::vector<InstanceHandle> InstanceHandleSeq;

        // --- InstanceState: --- //
        class OMG_DDS_API InstanceState;

        // --- Listener: --- //
        class OMG_DDS_API Listener;

        // --- null_type: --- //
        class OMG_DDS_API null_type;

        // --- QoS: --- //
        class OMG_DDS_API EntityQos;

        // --- Reference: --- //
        template <typename DELEGATE>
        class OMG_DDS_API Reference;

        template<class TO, class FROM>
        TO static_ref_cast(const FROM& r);

        template<class TO, class FROM>
        TO dynamic_ref_cast(const FROM& r);

        // --- SampleState: --- //
        class OMG_DDS_API SampleState;

        // --- Status: --- //
        class OMG_DDS_API Status;

        // --- StatusCondition: --- //
        typedef tdds::core::StatusConditionBase<OMG_DDS_STATUS_CONDITION_DELEGATE>
        StatusConditionBase;

        template <typename ENTITY>
        class OMG_DDS_API StatusCondition;
        
        // --- StatusMask: --- //
        class OMG_DDS_API StatusMask;

        // --- Time: --- //
        class OMG_DDS_API Time;

        // --- Value: --- //
        template <typename DELEGATE>
        class OMG_DDS_API Value;

        // --- ViewState: --- //
        class OMG_DDS_API ViewState;

        // --- WaitSet: --- //
        typedef tdds::core::WaitSet<OMG_DDS_WAIT_SET_DELEGATE> WaitSet;
    }
}


#endif // !defined(OMG_DDS_CORE_FWD_HPP_)
